<?php

/**
 * Api para administrar las imagenes cargadas por usuarios
 * 
 * Con esta api, se podra crear, actualizar u obtener info 
 * relacioanda con imágenes que el usuario sube.
 *
 */
class PapiWS_Service_UserImage
{
	
	/**
	 * Trae la lista de imágenes que tenemos en la sesíón
	 * 
	 * @param string token
	 * @return mixed Array of UserImageVO
	 */
	public function getSessionImages( $token )
	{
		// levantar info del cache.
		$cacheId = 'userimage_' . $token;
		$imageList = Zend_Registry::get('userImageCache')->load( $cacheId );
		$images = array();
		if ( is_array($imageList) && count($imageList) > 0 ) {
			foreach( $imageList as $image ) {
				$shape = new PapiWS_Model_ShapeVO();
				$shape->id 			= $image->id;
				$shape->name 		= "";
				$shape->swfUrl 		= $image->imageUrl;
				$shape->pngUrl 		= $image->thumbnailUrl;
				$shape->svgUrl 		= null;
				$shape->userImage 	= true;
				$shape->width 		= $image->width;
				$shape->height 		= $image->height;
				$images[] = $shape;
			}
		}
		return $images;
	}

	/**
	 * Saca una imágen que teníamos guardada en la sesión
	 * 
	 * @param string $token
	 * @param mixed $shapeVO ShapeVO to remove
	 * @return boolean true on success false otherwise
	 */
	public function removeSessionImage( $token, $shapeVo )
	{
		// levantar info del cache.
		$cacheId = 'userimage_' . $token;
		$imageList = Zend_Registry::get('userImageCache')->load( $cacheId );

		if ( ! isset( $imageList[$shapeVo->id] ) ) {
			throw new Ext_Exception( 'No exista la imagen especficada!' );
		}

		unset( $imageList[$shapeVo->id] );

		Zend_Registry::get('userImageCache')->load( $imageList, $cacheId );
		
		// TODO: borrarla del directorio.
		return $imageList;
	}

	/**
	 * Persistir la imágen a un directorio de almacenamiento.
	 *
	 * Esta función persiste la imagen a un directorio de almacenamiento definitivo.
	 * Todas las imagenes se guardan en directorios temporales hasta que el usuario
	 * guarda definitivamente el producto y congela las imagenes con esta función.
	 * 
	 * @param mixed $shapeVO ShapeVO to persist
	 * @param integer $personalizedProductId id of product where this image is useed
	 * @return mixed The frozen shapeVO or an exception if the operation failed
	 */
	public function freeze( $shapeVO, $personalizedProductId )
	{

		// validate shapeVO
		if ( $shapeVO->id == null ) {
			throw new Ext_Exception( 'Error de consistencia de datos. Image id es null.' );
		}

		$userImageModel = new PapiWS_Model_UserImage();
		$row = $userImageModel->find( $shapeVO->id )->current();
		if ( count( $row ) == 0 ) {
			$row =  $userImageModel->createRow();
		}
		$userImageModel->getAdapter()->setLobAsString(true);
		$row->user_image_id = $shapeVO->id;
		$row->personalized_product_id = $personalizedProductId;
		$row->creation_date = Ext_Db_Date::now();
		$row->object = serialize( $shapeVO );
		$stat = $row->save();
		if ( $stat === false ) {
			throw new Ext_Exception( 'Can not save image data to database.' );
		}

		// save to file system
		$imagePath = $this->getImagePath( $personalizedProductId, $shapeVO->id );
		$stat = copy( $shapeVO->swfUrl, $imagePath );
		if ( $stat === false ) {
			$row = $userImageModel->find( $shapeVO->id )->current();
			$row->delete();
			throw new Ext_Exception( 'Error guardando imagen al storage!' );
		}

		// update VO
		$imageUrl = sprintf( "%s/id/%s/personalizedProductId/%d",
			Zend_Registry::get('config')->image_storage->imageUrl,
			$shapeVO->id,
			$personalizedProductId
		);
		$thumbUrl= sprintf( "%s/id/%s/personalizedProductId/%d",
			Zend_Registry::get('config')->image_storage->thumbUrl,
			$shapeVO->id,
			$personalizedProductId
		);
		$shapeVO->swfUrl = $imageUrl;
		$shapeVO->pngUrl = $thumbUrl;

		return $shapeVO;
	}

	/**
	 * Devuelve el path a una imagen en el storage. Para uso interno.
	 * 
	 * @param integer $personalizedProductId Id del producto dueño de esta imagen
	 * @param string $imageId id de la imagen
	 * @return string path a la imagen en el storage
	 */
	public function getImagePath( $personalizedProductId, $imageId ) 
	{
		$storagePath = Zend_Registry::get('config')->image_storage->path;
		$prefix = sprintf("%010d", round($personalizedProductId / 10000) );
		$path = $storagePath . DIRECTORY_SEPARATOR . $prefix;
		if ( ! file_exists( $path ) ) {
			$stat =	mkdir( $path );
			if ( $stat === false ) {
				throw new Ext_Exception( 'No pudo crear el directorio: ' . $path );
			}
		}
		$path .= DIRECTORY_SEPARATOR . 'img' . $imageId;

		return $path;
	}

}
